from langchain_openai import ChatOpenAI
from langchain.prompts.chat import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)

from langchain import LLMChain
from langchain.schema import BaseOutputParser
import time

from config.model_config import get_chat_openai_xin, get_chat_openai_by_biaoshu


# class CommaSeparatedListOutputParser(BaseOutputParser):
#     """将 LLM 调用的输出解析为逗号分隔的列表。"""
#     def parse(self, text: str):
#         """解析 LLM 调用的输出。"""
#         return text.strip().split(", ")
    

template = "您是一位有用的助手，可以生成逗号分隔的列表。用户将传入一个类别: {text}，您应该在该类别中生成 {number} 个对象，并以逗号分隔列表形式。仅返回逗号分隔的列表，仅此而已。"
chat_prompt = ChatPromptTemplate.from_template(template)
start_time = time.time()

chain = LLMChain(
    llm = get_chat_openai_xin(streaming=False),
    prompt=chat_prompt,
    # output_parser=CommaSeparatedListOutputParser()
)
# res = chain.run(number = 4, text = "colors")
res = chain.invoke({"number": 4, "text": "colors"})
print(res)
end_time = time.time()
elapsed_time = end_time - start_time

print(f"代码运行时间: {elapsed_time:.2f} 秒")
##
# 1.LLMChain 构造方式
# chain = LLMChain(
#     llm = get_chat_openai_xin(streaming=False),
#     prompt=chat_prompt,
# )
# 2.管道符 | 构造方式
# chain = chat_prompt | get_chat_openai_xin(streaming=False) 的区别
#
# 1.LLMChain 构造方式
# 直接返回‌原始字符串‌类型的响应。
# ‌调用方式‌：通过 chain.run(input) 或 chain.invoke(input) 执行。
# ‌适用场景‌：需直接获取模型生成的原始文本时使用 412。
#
# 2.
# ‌输出格式‌：返回 ‌AIMessage 对象‌（如 AIMessage(content="...")），需通过 .content 属性提取文本内容 28。
# ‌调用方式‌：通过 chain.invoke({"input": "text"}) 执行。
# ‌特点‌：
# 属于LCEL（LangChain Expression Language）的声明式语法 38；
# 天然支持链式组合（如追加输出解析器 | output_parser）3

# 输出一致性解决方案
# 若需统一为字符串格式，可在管道写法后追加字符串解析器：
#
# python
# Copy Code
# from langchain_core.output_parsers import StrOutputParser
#
# chain = chat_prompt | get_chat_openai_xin(streaming=False) | StrOutputParser()
# 此时两种方式输出均为字符串 712。


# ⚙️ 性能关键点解析
# ‌流式处理优化‌
# LCEL 通过管道符连接组件时，数据以 ‌Token 粒度流式传递‌，减少内存占用并提升响应速度（尤其对长文本生成场景）17。
#
# python
# Copy Code
# # LCEL 流式调用示例（逐 Token 输出）
# for chunk in chain.stream({"input": "问题"}):
#     print(chunk, end="")